<?php

class Pagination
{
	private $nb_datas;
	private $nb_pages;
	private $current_page = 1;
	private $start_offset = 0;

	private $link;
	private $next_page;
	private $previous_page;
	private $first_page;
	private $last_page;

	/**
	* @var nombre de donnees sur une seule page
	* @access private
	*/
	private $data_per_page = 10;

	/**
	* @var nombre de liens s'affichant sur les cotes de la page courante
	* @access private
	*/
	private $nb_link_per_page = 5;

	/**
	* @var url de la page actuelle
	* @access private
	*/
	private $url = '';

	/**
	* @var activation de l'url rewriting
	* @access private
	*/
	private $url_rewriting = false;

	/**
	* @var nom de la variable $_GET
	* @access private
	*/
	private $var_page = 'page';

	/**
	* @var separateur qui separe (logique haha...) les liens entre eux
	* @access private
	*/
	private $separator = '|';

	/**
	* @var nombre d'espace avant le separateur
	* @access private
	*/
//	private $space_before = 1;
	private $space_before = 0;

	/**
	* @var nombre d'espace apres le separateur
	* @access private
	*/
//	private $space_after = 1;
	private $space_after = 0;

	/**
	* @var options disponibles
	* @access private
	*/
	private $options = array(
		'nb_datas',
		'data_per_page',
		'nb_link_per_page',
		'url',
		'url_rewriting',
		'var_page',
		'space_before',
		'space_after',
		'separator'
	);

	/**
	* Constructeur de la class avec en argument les options choisis
	*/
	public function __construct($options = null)
	{
		$this->generateOptions($options);
		$this->generatePages();
		$this->generateLink();
	}

	/**
	* Genere les options
	*/
	private function generateOptions($options)
	{
		foreach ($options as $key => $value)
		{
			if (in_array($key, $this->options) && !is_null($value))
				$this->$key = $value;
		}
	}

	/**
	* Genere le nombre de pages, la page courante et le premiers offset
	*/
	private function generatePages()
	{
		$this->nb_pages = ceil($this->nb_datas / $this->data_per_page);
		$this->current_page = !empty($_GET[$this->var_page]) && is_numeric($_GET[$this->var_page]) && $_GET[$this->var_page] < $this->nb_pages + 1 ? $_GET[$this->var_page] : 1;
		$this->start_offset = ($this->current_page - 1) * $this->data_per_page;
	}

	/**
	* Genere les liens
	*/
	private function generateLink()
	{
		if ($this->url_rewriting)
		{
			$this->link = $this->url;

			$this->next_page = sprintf($this->url, $this->current_page + 1);
			$this->previous_page = sprintf($this->url, $this->current_page - 1);
			$this->first_page = sprintf($this->url, 1);
			$this->last_page = sprintf($this->url, $this->nb_pages);
		}
		else
		{
			$this->link = $this->url . (strstr($this->url, '?') ? '&' : '?');
			$this->link .= $this->var_page . '=';

			$this->next_page = $this->link . ($this->current_page + 1);
			$this->previous_page = $this->link . ($this->current_page - 1);
			$this->first_page = $this->link . 1;
			$this->last_page = $this->link . $this->nb_pages;
		}
	}

	/**
	* Retourne le lien de la premiere page si la page courante est superieur a 3 et celui de la page precedente
	*
	* @return string
	*/
	public function getFirstLinks()
	{
		$display = '';
		if ($this->current_page != 1)
		{
			if ($this->current_page >= 3)
				$display .= ' <a href="' . $this->first_page . '"><<&nbsp;</a> ';
			
			$display .= ' <a href="' . $this->previous_page . '" ><&nbsp;</a> ';
			return $display;
		}
	}

	/**
	* Retourne le lien de la page suivante et celui de la derniere page si la page courante n'est pas egale au nombre de pages
	*
	* @return string
	*/
	public function getLastLinks()
	{
		$display = '';
		if ($this->current_page != $this->nb_pages)
		{
			$display .= ' <a href="' . $this->next_page . '">&nbsp;></a> ';
			if ($this->current_page <= $this->nb_pages - 2)
				$display .= ' <a href="' . $this->last_page . '">&nbsp;>></a> ';
			
			return $display;
		}
	}

	/**
	* Retourne la liste des liens avec le separateur si il n'est pas vide : 0 | 1 | 2 | 3 | 4
	*
	* @return string
	*/
	public function getLinks()
	{
		$display = '';
		for ($i = 1; $i <= $this->nb_pages; $i++)
		{
			if ($i - 1 < ($this->current_page + $this->nb_link_per_page) && $i + 1 > ($this->current_page - $this->nb_link_per_page))
			{
				if ($i == $this->current_page)
					$display .= '<u><b>' . $i . '</b></u>';
				else
				{
					if ($this->url_rewriting)
						$url = sprintf($this->link, $i);
					else
						$url = $this->link . $i;
					
					$display .= '<a href="' . $url . '">' . $i . '</a>';
				}

				if ($i != $this->current_page + $this->nb_link_per_page && $i != $this->nb_pages)
				{
					for ($j = 0; $j <= $this->space_before; $j++)
						$display .= '&nbsp;';
						//$display .= ' ';
					
					$display .= $this->separator;
					for ($j = 0; $j <= $this->space_after; $j++)
						$display .= '&nbsp;';
						//$display .= ' ';
				}
			}
		}
		return $display;
	}

	public function __get($name)
	{
		if (property_exists($this, $name))
			return $this->$name;
	}

	public function __set($name, $value)
	{
		if (property_exists($this, $name))
			$this->$name = $value;
	}
}

?>
